`timescale 1ns / 1ps

module conexion_vga(_clk_i,_rst_i,posicion_paleta_i,posicion_bola_fila_i,posicion_bola_columna_i,perdio_i,
					 RGB_o,hsync_o,vsync_o);
	//ENTRADAS				 
	input _clk_i, _rst_i;
	input [9:0] posicion_paleta_i;
	input [9:0] posicion_bola_fila_i;
	input [9:0] posicion_bola_columna_i;
	input perdio_i;
	
	//SALIDAS
	output reg [7:0] RGB_o;
	output hsync_o, vsync_o;
	
	//WIRES
	wire video_o, fondo, paleta, bola, perdio;
	wire [2:0] pared;
	wire [7:0] fondo_rgb, pared_rgb, paleta_rgb, bola_rgb, perdio_rgb;
	wire [9:0] filas, columnas;
		
	//MODULO ENCARGADO SINCRONIZAR LAS ENTRADAS VGA PARA EL USO DE LOS DEMAS MODULOS
	sincronizador_vga sincronizador (._clk_i(_clk_i),._rst_i(_rst_i), 
												.filas_o(filas),.columnas_o(columnas),
												.hsync_o(hsync_o),.vsync_o(vsync_o),.video_o(video_o));  
								
	//MODULO ENCARGADO DE PINTAR EL FONDO EN LA PANTALLA
	init_fondo fondo_vga (.filas_i(filas),.columnas_i(columnas),
								 .inicie_fondo_o(fondo),.inicie_fondo_rgb_o(fondo_rgb));	
	
	//MODULO ENCARGADO DE PINTAR LAS PAREDES EN LA PANTALLA
	init_pared pared_vga (.filas_i(filas),.columnas_i(columnas),
								 .pared_o(pared),.pared_rgb_o(pared_rgb));
							
	//MODULO ENCARGADO DE PINTAR LA PALETA EN LA PANTALLA
	init_paleta paleta_vga (.filas_i(filas),.columnas_i(columnas),.posicion_paleta_i(posicion_paleta_i),
									.paleta_o(paleta),.paleta_rgb_o(paleta_rgb));
	
	//MODULO ENCARGADO DE PINTAR LA BOLA EN LA PANTALLA
	init_bola bola_vga (.filas_i(filas),.columnas_i(columnas),
							  .posicion_bola_fila_i(posicion_bola_fila_i),.posicion_bola_columna_i(posicion_bola_columna_i),
							  .bola_o(bola),.bola_rgb_o(bola_rgb));

	//MODULO ENCARGADO DE PINTAR EL MENSAJE DE PERDIO EN LA PANTALLA
	init_perdio perdio_vga (.filas_i(filas),.columnas_i(columnas),
									.perdio_o(perdio),.perdio_rgb_o(perdio_rgb));								 
	
	//SE RECUPERA CUAL PIXEL ESTA SIENDO SELECCIONADO PARA QUE ESTE SEA PINTADO
	//DEL COLOR REQUERIDO DENTRO DEL MODULO CORRESPONDIENTE
	always @(posedge _clk_i)
	begin
		if (video_o && ~_rst_i)
			begin
				if(pared[0] || pared[1] || pared[2])
					begin
						RGB_o <= pared_rgb;
					end
				else if(paleta)
					begin
						RGB_o <= paleta_rgb;
					end
				else if(bola)
					begin
						RGB_o <= bola_rgb;
					end		
				else if(perdio && perdio_i)
					begin
						RGB_o <= perdio_rgb;
					end
				else if(fondo && ~perdio_i)
					begin
						RGB_o <= fondo_rgb;
					end
				else 
					begin
						RGB_o <= 0;
					end
			end
		else
			begin
				RGB_o <= 0;
			end
	end

endmodule
